package com.azt.utils;

import org.apache.commons.lang.StringUtils;
import org.springframework.core.io.support.PropertiesLoaderUtils;

import java.io.IOException;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 快钱支付
 * Created by shangwq on 2016/10/12.
 */
public class KuaiQianPay {

    public static final String PAY_PROP = "/pay/pay.properties";

    /**
     * 快钱支付接口地址（生产）
     * */
    private static final String PAY_URL = "https://www.99bill.com/gateway/recvMerchantInfoAction.htm";

    /**
     * 快钱支付接口地址（测试）
     * */
    private static final String TEST_PAY_URL = "https://sandbox.99bill.com/gateway/recvMerchantInfoAction.htm";

    /**
     * 支付结果回调地址
     * */
    private static final String NOTIFY_URL = "https://www.azt365.com";

    /**
     * 人民币帐号
     * */
    private static final String MERCHANT_ACCTID = "1001213884201";

    /**
     * 构造快钱支付请求form数据
     * @param payType 支付方式
     * @param orderNumber 订单号
     * @param orderAmount 订单金额（单位：分）
     * @param orderDate 订单时间
     * */
    public static String buildPayRequest(String payType, String orderNumber, String orderAmount, Date orderDate) {
        String orderTime = CommonUtil.formatDate(orderDate, "yyyyMMddHHmmss");          //商户订单提交时间（格式：yyyyMMddHHmmss）

        Map<String, String> param = new LinkedHashMap<>();
        param.put("inputCharset", "1");     //字符集：UTF-8
        param.put("pageUrl", "");
        param.put("bgUrl", NOTIFY_URL);              //支付结果回调地址
        param.put("version", "v2.0");       //网关版本
        param.put("language", "1");         //网关页面显示语言：中文
        param.put("signType", "4");         //签名类型
        param.put("merchantAcctId", MERCHANT_ACCTID);    //人民币帐号
        param.put("payerName", "");         //支付人姓名
        param.put("payerContactType", "");  //支付人联系方式类型：1.邮箱 2.手机
        param.put("payerContact", "");      //支付人联系方式
        param.put("orderId", orderNumber);
        param.put("orderAmount", orderAmount);
        param.put("orderTime", orderTime);
        param.put("productName", "安装通平台商品采购");      //商品名称
        param.put("productNum", "");        //商品数量
        param.put("productId", "");         //商品代码
        param.put("productDesc", "");       //商品描述
        param.put("ext1", "");              //扩展字段1
        param.put("ext2", "");              //扩展字段2
        param.put("payType", payType);
        param.put("bankId", "");            //银行代码
        param.put("redoFlag", "");          //同一订单禁止重复提交标志
        param.put("pid", "");               //合作伙伴在快钱的用户编号

        String signMsg = buildSignMsg(param);
        param.put("signMsg", signMsg);      //加密报文

        return buildForm(param);
    }

    /**
     * 生成加密报文
     * */
    private static String buildSignMsg(Map<String, String> param) {
        StringBuilder data = new StringBuilder("");
        for(String key : param.keySet()) {
            String value = param.get(key);
            if(StringUtils.isNotBlank(value)) {
                data.append(key).append("=").append(param.get(key)).append("&");
            }
        }
        if(data.toString().endsWith("&")) {
            data = data.deleteCharAt(data.length() - 1);
        }
        Pkipair pki = new Pkipair();
        return pki.signMsg(data.toString());
    }

    /**
     * 构造请求form表单
     * */
    private static String buildForm(Map<String, String> param) {
        try {
            Properties prop = PropertiesLoaderUtils.loadAllProperties(PAY_PROP);
            int payEnv = CommonUtil.safeToInt(prop.getProperty("payEnv", "0"), 0);

            String url = TEST_PAY_URL;
            if(payEnv == 1) {
                url = PAY_URL;
            }

            StringBuilder html = new StringBuilder("<form id='payForm' action='").append(url).append("' method='post'>");
            for(String key : param.keySet()) {
                html.append("<input type='hidden' name='").append(key).append("' value='").append(param.get(key)).append("'/>");
            }
            html.append("</form>");
            html.append("<script type='text/javascript'>document.getElementById('payForm').submit();</script>");
            return html.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

}
